Skip to content

置信度分层与 Human-in-the-loop ​

标签
AI/agent/置信度
字数
4076 字
阅读时间
16 分钟

这套设计的起点是一个很朴素的问题:如果不知道哪些输出是错的,能不能先判断哪些是「有把握」的?

答案是能,但要成立有一个前提条件——置信度分数本身得可信。这一篇先讲这个前提(校准与区分度),再讲怎么用它搭建三层路由。

形式化:选择性预测 ​

这套机制在机器学习里有正式名字:选择性预测(Selective Prediction)——给模型装一个「拒绝选项」,置信度低于某个校准过的阈值时弃权。

形式化:基分类器 f:X→Y,加一个选择(弃权)函数 g:X→{0,1}——g(x)=1 表示信任 f(x),g(x)=0 表示弃权。g 通常实现为对某个实数置信函数 g~(x) 取阈值:

g(x)=1⟺g~(x)>τ

两个核心指标 ​

指标定义含义
覆盖率 Coverage C(h)选择作答的那部分输入的比例自动化处理了多大的量
风险 Risk R(h)只在被接受的子集上计算错误率自动作答的准确度有多可靠

关键在「只在被接受的子集上算」——这就是为什么弃权能提高「作答部分的准确率」:你并没有让模型变准,只是把最可能错的那部分挪出了统计范围。

阈值降低 → 覆盖率上升,风险也上升。 这条权衡曲线(risk–coverage curve)下面的面积是 AURC,越低越好。

AURC 不适合当单一标量指标用——它**对模型的整体准确度敏感**。模型整体更准会自然压低 AURC,所以拿 AURC 横向比较不同模型时要小心。

前提拆成两个正交的轴 ​

「置信度分数得可信」这句话其实包含两件不同的事,混在一起就没法诊断:

轴回答什么指标
校准(Calibration)说 70% 的时候,是不是真的有 70% 正确ECE
区分度(Discrimination)能不能把对的排在错的上面AUROC

校准:ECE ​

定义:一个完美校准的模型,输出 70% 置信度时应该正好在 70% 的情况下正确。

ECE(Expected Calibration Error) 的算法是:把所有预测分成 M 个等宽箱(常用 M=15),计算每个箱内「准确率与置信度之差的绝对值」,再按箱内样本数加权平均。

ECE=∑m∈M|Bm|N|acc(Bm)−conf(Bm)|

工程上常用的判据是 ECE < 0.05 视为良好校准。

三种后验校准方法:

方法做法
Platt Scaling在原始 logits 上拟合一个逻辑回归,平滑概率估计
Isotonic Regression非参数方法,学习从分数到校准概率的单调映射(不假设函数形状)
Temperature ScalingPlatt scaling 的单参数变体:把所有 logits 除以一个学到的温度 T>0。T>1 软化概率、压低过自信;T<1 锐化。在留出验证集上以最小化 NLL 为目标优化

Temperature Scaling 的性价比最高——只有一个参数,却直接控制了喂给弃权判断门的原始置信分数。

区分度:AUROC ​

AUROC 衡量模型区分「正确预测」与「错误预测」的能力。

AUROC = 85% 的意思是:模型在 85% 的情况下,给正确预测分配了比错误预测更高的置信度。

注意这跟校准完全是两件事:

  • 一个模型可以校准很差但区分度很好——它所有分数都偏高一截,但相对排序是对的(弃权判断照样能用)
  • 也可以校准还行但区分度很差——分数分布很准,但对错混在一起排不开(弃权判断就废了)

对弃权机制来说,区分度是更本质的那一轴——因为这个机制依赖的是「谁比谁更值得信任」这个排序,不是绝对数值。

一个额外的指标 ​

SAC(选择性准确度约束):在给定准确率阈值下可达到的最大覆盖率。它比覆盖率更贴近实际问法——「我要求自动作答的部分准确率不低于 95%,那最多能自动处理多少比例?」对风险敏感的应用,这个指标比 AUROC 更直接。

「置信度分数得可信」包含两件不同的事,混在一起就没法诊断。

                        区分度好                区分度差
   校准好     ┌────────────────────────┬────────────────────────┐
              │ 理想状态                │ 分数分布很准,            │
              │ 分数既准、排序也对       │ 但对错混在一起排不开       │
              │                        │ └─ 弃权判断就废了         │
              ├────────────────────────┼────────────────────────┤
   校准差     │ 所有分数都偏高一截,     │ 最差                     │
              │ 但相对排序是对的         │                          │
              │ └─ 弃权判断照样能用      │                          │
              └────────────────────────┴────────────────────────┘

   两轴的指标不同
     校准 Calibration       说 70% 的时候是不是真的有 70% 正确   → ECE
     区分度 Discrimination  能不能把对的排在错的上面             → AUROC

   对弃权机制来说,区分度是更本质的那一轴
     因为它依赖的是「谁比谁更值得信任」这个排序,不是绝对数值。

置信度信号从哪来 ​

基线:MSP ​

最简单的做法是最大 softmax 概率(MaxProb / MSP),maxyP(y|x)<τ 就弃权。

但它有个出名的缺陷:现代深度网络对分布外(OOD)输入异常过度自信,会给完全无意义的数据打高分。所以 MSP 作为 OOD 检测信号不可靠。

更好的信号:

信号依据
Energy-basedsoftmax 分母的负对数——比 MSP 更可靠的 OOD 检测信号
Mahalanobis 距离在特征空间里算类条件高斯距离,不确定性估计优于原始 softmax
MC Dropout推理时保持 dropout 活跃,跑多次随机前向得到预测分布

MC Dropout 的 10–50 次通常就够。它还把不确定性拆成了两类:

  • 认知不确定性(Epistemic):由 MC 样本间的方差捕获——高方差说明模型对这个输入缺乏知识
  • 偶然不确定性(Aleatoric):数据本身固有的噪声

工程上真正好用的信号:一致性 ​

上面这些都是模型内部信号。在 LLM 场景里还有一个不需要 logprobs 就能拿到的信号——多次采样的一致性:

Prompt Engineering 里的 Self-Consistency 本来是用来提准确率的(采样 k 条路径多数投票)。但它顺带给出了一个天然的不确定性度量:多数票的比例就是置信度——10 条路径里 9 条同意,远比 5:5 更可信。

这个信号的好处是它不依赖模型暴露 logprobs,也不需要校准层,代价只是多跑几次采样。

置信度信号按「需要拿到什么」分层。

   ① 基线:MSP(最大 softmax 概率)
        max_y P(y|x) < τ 就弃权
        └─ 出名的缺陷:现代深度网络对分布外(OOD)输入异常过度自信,
           会给完全无意义的数据打高分 → 作为 OOD 检测信号不可靠
        │
        ▼
   ② 更好的模型内部信号
        Energy-based    softmax 分母的负对数 —— 比 MSP 更可靠的 OOD 信号
        Mahalanobis     在特征空间里算类条件高斯距离
        MC Dropout      推理时保持 dropout 活跃,跑多次随机前向
                        └─ 10–50 次通常就够
                        └─ 把不确定性拆成两类:
                           认知不确定性 = MC 样本间的方差(高方差说明缺乏知识)
                           偶然不确定性 = 数据本身固有的噪声
        │
        ▼
   ③ 工程上真正好用的:一致性
        多次采样的一致性 —— 不需要 logprobs 就能拿到
        └─ Self-Consistency 本来是用来提准确率的(采样 k 条路径多数投票),
           但它顺带给出了一个天然的不确定性度量:
           多数票的比例就是置信度 —— 10 条里 9 条同意,远比 5:5 更可信
        └─ 好处:不依赖模型暴露 logprobs,也不需要校准层,
           代价只是多跑几次采样

   阈值 τ 怎么定:在留出的验证集上按「覆盖率 vs 选择性风险」的偏好调。
   没有普适值 —— 它取决于你能接受多少人工介入量,以及误判的代价。

阈值 τ 怎么定 ​

在留出的验证集上按「覆盖率 vs 选择性风险」的偏好调。这里没有普适值——它取决于你能接受多少人工介入量,以及误判的代价。

与相邻概念的分工 ​

三个机制经常被混为一谈,它们解决的是相邻但不同的问题:

选择性预测Conformal PredictionOOD 检测
主目标通过弃权优化准确率-覆盖的权衡产出有有限样本覆盖保证的预测集识别与训练分布语义不同的输入
拒绝判据置信度低于校准过的阈值非一致性分数超过分位数阈值密度或能量分数低于分布内边界
输出类预测 或弃权决定预测集(可能为空或多类)二元:分布内 / 分布外
形式化成本敏感的分类问题无分布假设的框架——

现代系统通常是组合的:

先用 energy-based 或 Mahalanobis 分数过滤 OOD 输入
    ↓
再对剩下的分布内数据应用校准过的置信度阈值

为什么要分两步:OOD 输入的问题是「模型对它过度有把握但完全错了」,而不是「模型对它没把握」——MSP 在这类输入上给高分,所以纯阈值方案拦不住。必须先有一层 OOD 检测,退掉那些「自信的胡说」。

形式化上,理想的拒绝策略是 Chow's Rule:比较最大后验概率与成本比阈值来最小化期望风险。有些架构更进一步,加一个显式的「弃权」输出类。

三个机制经常被混为一谈,它们解决的是相邻但不同的问题。

                  选择性预测            Conformal Prediction     OOD 检测
   主目标         通过弃权优化          产出有有限样本           识别与训练分布
                 准确率-覆盖的权衡      覆盖保证的预测集          语义不同的输入
   拒绝判据       置信度低于            非一致性分数超过          密度或能量分数
                 校准过的阈值          分位数阈值               低于分布内边界
   输出           类预测 或 弃权决定     预测集(可空或多类)       二元:内 / 外
   形式化         成本敏感的分类问题     无分布假设的框架           ——

   现代系统通常是组合的
       先用 energy-based 或 Mahalanobis 分数过滤 OOD 输入
            │
            ▼
       再对剩下的分布内数据应用校准过的置信度阈值

   为什么要分两步
      OOD 输入的问题是「模型对它过度有把握但完全错了」,
      而不是「模型对它没把握」—— MSP 在这类输入上给高分,
      所以纯阈值方案拦不住。
      └─ 必须先有一层 OOD 检测,退掉那些「自信的胡说」

   形式化上,理想的拒绝策略是 Chow's Rule:
   比较最大后验概率与成本比阈值来最小化期望风险。
   有些架构更进一步,加一个显式的「弃权」输出类。

三层路由 ​

把上面的零件拼起来就是本专栏开头描述的那套结构:

                    ┌→ 高置信度 → 自动执行
Input → Rule Engine ┤
                    └→ 低置信度 → LLM Review
                                      │
                                  ┌───┴───┐
                                  ↓       ↓
                              高置信度  低置信度
                                  ↓       ↓
                               执行   Human Review

高置信度的典型特征:字段完整、字段一致、页面类型已知、Button Role 已知、Button Label 命中规则、历史上大量验证通过。

低置信度的典型特征:未知页面、未知 Label、多个候选 Button、字段冲突、历史上出现过错误。

注意最后两条——历史表现本身就是置信度信号。这与 Rule 与 LLM 的边界 里的规则冲突处理连起来:规则没命中、语义判断也不确定时,该走的是降级路径而不是猜。

核心思想一句话 ​

减少 Human 需要 Review 的数据量,而不是消灭 Human。

这也解释了三层而不是两层的原因:如果只有「自动执行」和「人工」两级,那么所有低置信度都要直接找人,人工量降不下来。中间插一层 LLM Review,是拿模型去消化掉那些「规则不确定、但模型看得懂」的部分。

从线上反哺 ​

Human Review 最终产出的是三元组:

Input + System Output + Correct Output

进入 Case Repository(失败案例库)后定期聚类,按错误类型归并:

Button Semantic Error
Missing Field Error
Page Type Error
Rule Conflict
Unknown Case

再走:Failed Cases → LLM Analyze → 生成候选规则 → Regression Test → 人工 Review → Rule Update。

这条链路有三处设计要点,都在 LLM Evaluation 与反馈闭环 里展开:

  1. 聚类是必须的一步——否则是逐个案例打补丁,规则集会越来越碎
  2. 生成的候选规则必须过 Regression Test——这是防止「修一个坏三个」的唯一机制
  3. 规则更新前仍要人工 Review——因为改规则的影响范围超出单个案例

Human Review 产出的是三元组,反哺链路有两段。

   Input + System Output + Correct Output
        │
        ▼
   Case Repository(失败案例库)
        │  定期聚类,按错误类型归并
        ▼
   Button Semantic Error / Missing Field Error /
   Page Type Error / Rule Conflict / Unknown Case
        │
        ▼
   Failed Cases ──▶ LLM Analyze ──▶ 生成候选规则
                                        │
                                        ▼
                                  Regression Test
                                        │
                                        ▼
                                    人工 Review
                                        │
                                        ▼
                                    Rule Update

   三处设计要点(都在 LLM Evaluation 那篇展开)
     ① 聚类是必须的一步 —— 否则是逐个案例打补丁,规则集会越来越碎
     ② 候选规则必须过 Regression Test —— 这是防止「修一个坏三个」的唯一机制
     ③ 规则更新前仍要人工 Review —— 改规则的影响范围超出单个案例

一条研究层面的旁证 ​

一项对 523 个 ImageNet 分类器的大规模研究里有两个值得记的发现:

  • 知识蒸馏在所有不确定性估计指标上都能持续改进,且与蒸馏的具体形式无关
  • 温度缩放不只改善校准(降 ECE),还显著增强了 AUROC 和选择性预测性能

第二条印证了前面那句「校准和区分度是两轴」——它们相关但不重合,一个手段可以同时改善两侧,但测量时必须分开测,否则你不知道改善的是哪一侧。

相关 ​

参考 ​

贡献者 ​

文件历史 ​